﻿using System.Collections.Generic;
using System.Drawing;

namespace Baustein {
    class cGezeichneterBaustein {
        cPoint lAusgang;
        List<cPoint> lL = new List<cPoint>();
        int iHöhe = 200,
            iBreite = 100,
            ix0,
            iy0;
        List<cPoint> lRectangle = new List<cPoint>();
        public cGezeichneterBaustein(Graphics grafik, CBaustein baustein, int ix0, int iy0, int ihöhe, int iBreite) {
            this.baustein = baustein;
            this.grafik = grafik;
            this.ix0 = ix0;
            this.iy0 = iy0;
        }
        public int IBreite {
            get { return iBreite; }
            set { iBreite = value; }
        }
        public int IHöhe {
            get { return iHöhe; }
            set { iHöhe = value; }
        }
        public int Ix0 {
            get { return ix0; }
            set { ix0 = value; }
        }
        public int Iy0 {
            get { return iy0; }
            set { iy0 = value; }
        }
        Graphics grafik;
        public Graphics Grafik {
            get { return grafik; }
            set { grafik = value; }
        }
        public void Zeichnen() {
            SolidBrush whiteBrush = new SolidBrush(Color.White);
            Rectangle rechteck = new Rectangle(
               ix0/*x-Koordinaten(nach rechts)*/,
               iy0/*y-Koordinaten(nach unten)*/,
               iBreite/*Breite*/,
               iHöhe/*Länge*/);
            //Fläche für Zeichnung
            grafik.DrawRectangle(Pens.Black, rechteck);
            Pen Pensile = new Pen(Color.Black);
            Brush Brush = new SolidBrush(Color.Black);
            for (int i = 0; i < baustein.IAnzEin; i++) {
                if (baustein.bEingaenge[i] == true) {
                    Pensile.Color = Color.Green;
                    Brush = new SolidBrush(Color.Green);
                } else {
                    Pensile.Color = Color.Red;
                    Brush = new SolidBrush(Color.Red);
                }
                if (baustein.BInvert[i] == false) {
                    grafik.DrawEllipse(Pensile, lL[i].pb.X, lL[i].pb.Y - 5, 10, 10);
                    grafik.FillEllipse(whiteBrush, lL[i].pb.X, lL[i].pb.Y - 5, 10, 10);
                } else {
                    grafik.FillEllipse(Brush, lL[i].pb.X, lL[i].pb.Y - 5, 10, 10);
                }
                grafik.DrawLine(Pensile, lL[i].pa, lL[i].pb);
            }
            Font drawFont = new Font("Arial", 20);
            SolidBrush drawBrush = new SolidBrush(Color.Black);
            if (baustein.BAusgang == true) {
                Pensile.Color = Color.Green;
            } else {
                Pensile.Color = Color.Red;
            }
            grafik.DrawLine(Pensile, lAusgang.pa, lAusgang.pb);
            grafik.DrawString(baustein.StrName, drawFont, drawBrush, rechteck);
        }
        public CBaustein baustein { get; set; }

        public bool check(System.Windows.Forms.MouseEventArgs e) {
            int a = 5;
            for (int i = 0; i < baustein.IAnzEin; i++) {
                if ((e.X >= lL[i].pa.X - a)
                    && (e.X <= lL[i].pb.X - 10)
                    && (e.Y >= lL[i].pa.Y - a)
                    && (e.Y <= lL[i].pb.Y + a)) {
                    if (this.baustein.bEingaenge[i] == true) {
                        this.baustein.bEingaenge[i] = false;
                        return true;
                    } else {
                        this.baustein.bEingaenge[i] = true;
                        return true;
                    }
                }
                if ((e.Y > lL[i].pb.Y - 5 - a)
                    && (e.Y < lL[i].pb.Y + 5 + a)
                    && (e.X > lL[i].pb.X)
                    && (e.X < lL[i].pb.X + 10 + a)) {
                    if (this.baustein.BInvert[i] == true) {
                        this.baustein.BInvert[i] = false;
                        return true;
                    } else {
                        this.baustein.BInvert[i] = true;
                        return true;
                    }
                }
            }
            if ((e.X >= lAusgang.pa.X - a)
                && (e.X <= lAusgang.pa.Y - a)
                && (e.Y >= lAusgang.pb.X + a)
                && (e.Y <= lAusgang.pb.Y + a)) {
                baustein.calc();
                return true;
            } else {
                return false;
            }
        }
        public void berechneLinie() {
            Point pA = new Point();
            Point pB = new Point();
            for (int i = 1; i <= baustein.IAnzEin; i++) {
                pA.X = ix0 - 50;
                pA.Y = i * iHöhe / (baustein.IAnzEin + 1) + iy0;
                pB.X = ix0 - 10;
                pB.Y = pA.Y;
                cPoint punkt = new cPoint(pA, pB);
                lL.Add(punkt);
            }
            lAusgang = new cPoint();
            Point pA2 = new Point();
            Point pB2 = new Point();
            pA2.X = ix0 + iBreite;
            pA2.Y = iHöhe / 2 + iy0;
            pB2.X = ix0 + iBreite + 50;
            pB2.Y = iHöhe / 2 + iy0;
            lAusgang.pa = pA2;
            lAusgang.pb = pB2;
        }
    }
}